package com.jlf.tool.sensitive;

import org.apache.commons.lang3.StringUtils;

/**
 * 脱敏辅助工具
 *
 * @author 吴建荣 2019-01-21
 */
public class Desensitize {
    private static final String PADDING = "*";
    /**
     * 姓名的最小长度
     */
    private static final int NAME_MIN = 2;
    private Desensitize(){}

    /**
     * 把所有的都替换为*
     * @author wujr
     * 2020/4/7
     * 变更历史
     * [wujr 2020/4/7 1.0 新增]
     *
     * @param text: 需要脱敏的文本
     * @return 脱敏后的文本
     */
    public static String all(String text){
        return StringUtils.rightPad("", text.length(), PADDING);
    }
    /**
     * 只显示第n个汉字，其他隐藏为星号
     * 例子：李**
     *
     * @param text 需要脱敏的文本
     * @param left 保留的文本的长度
     * @return 脱敏后的文本
     */
    public static String left(String text,int left) {
        if (StringUtils.isBlank(text)) {
            return "";
        }
        int length = StringUtils.length(text);
        if (left >= length){
            return text;
        }
        String txt = StringUtils.left(text, left);
        return StringUtils.rightPad(txt, length, PADDING);
    }

    /**
     * [身份证号] 110****58，前面保留3位明文，后面保留2位明文
     * 如果left+right &lt; length，则保留全文
     *
     * @param text 需要脱敏的文本
     * @param left 左边保留的长度
     * @param right 右边保留的长度
     * @return 脱敏后的文本内容
     */
    public static String around(String text, int left, int right) {
        if (StringUtils.isBlank(text)) {
            return "";
        }
        int length = StringUtils.length(text);
        if (left + right >= length){
            // 需要保留的文本超过了实际长度
            return text;
        }
        String txtLeft = StringUtils.left(text, left);
        String txtRight = StringUtils.right(text, right);
        return StringUtils.rightPad(txtLeft, length - right, PADDING).concat(txtRight);
    }

    /**
     * [固定电话] 后四位，其他隐藏
     * 例子：****1234
     *
     * @param text 需要脱敏的文本
     * @param right 保留的长度
     * @return 脱敏后的文本内容
     */
    public static String right(String text, int right) {
        if (StringUtils.isBlank(text)) {
            return "";
        }
        int length = StringUtils.length(text);
        if (right >= text.length()){
            return text;
        }
        return StringUtils.leftPad(StringUtils.right(text, right), length, PADDING);
    }
    /**
     * [电子邮箱] 邮箱前缀仅显示第一个字母，前缀其他隐藏，用星号代替，@及后面的地址显示
     * 例子:g**@163.com
     * @param email 原始邮箱
     * @return 脱敏后的邮箱
     */
    public static String email(final String email) {
        if (StringUtils.isBlank(email)) {
            return "";
        }
        final int index = StringUtils.indexOf(email, "@");
        if (index <= 1) {
            return email;
        } else {
            return StringUtils.rightPad(StringUtils.left(email, 1), index, PADDING)
                    .concat(StringUtils.mid(email, index, StringUtils.length(email)));
        }
    }
    /**
     * [地址] 只显示到地区，不显示详细地址；我们要对个人信息增强保护
     * 例子：北京市海淀区****
     *
     * @param address 原始地址
     * @param sensitiveSize 敏感信息长度
     * @return 脱敏后的地址
     */
    public static String address(final String address, final int sensitiveSize) {
        if (StringUtils.isBlank(address)) {
            return "";
        }
        final int length = StringUtils.length(address);
        return StringUtils.rightPad(StringUtils.left(address, length - sensitiveSize), length, PADDING);
    }

    /**
     * 对姓名进行脱敏
     * 如果只有两个字，则仅显示第一个字
     * 否则显示第一个和最后一个
     * @param name 需要脱敏的姓名
     * @return 脱敏后的姓名
     */
    public static String name(final String name){
        int length = StringUtils.length(name);
        if (length <= NAME_MIN){
            return left(name, 1);
        }
        return around(name, 1, 1);
    }
}
